# 管理，保存各个加载的模块
class Aio::ModuleManager
	
	attr_accessor :modules, :modules_count

	include Aio::Ui::Verbose

	# NOTE modules[reference_name] = {
	# 							:module_type     // 是cmd, input, output
	#								:module_layer_2  // cisco,huawei , style
	#	  						:full_path
  #							  :klass
	def initialize
#		self.module_info_by_path = {}
#		self.module_load_error_by_path = {}
#		self.module_paths = []
		self.modules = {}
		self.modules_count = {}
	end

	# 加载一个目录下的所有模块
	# @param [String] path 目录的路径
	# @param [Hash] options
	def load_modules(path, options={})
	end

	# 将实例化后的模块类放到 modules 中
	def add_module(path, module_type, module_layer_2, reference_name, module_klass)

		modules[reference_name] = {:module_type => module_type,
															 :module_layer_2 => module_layer_2,
															 :full_path => path, 
															 :klass	=> module_klass
															}
	end

	# 获得指定模块类型
	# 返回类型: Hash
	def get_modules_by_type(type)
		return_hash = {}

		type = type.to_s
		modules.each_pair do |n, m|
			if m[:module_type] != type
				next
			end
			return_hash[n] = m
		end

		return return_hash
	end

	# 通过设备类型获得模块类
	# 返回类型为： 数组
	def get_modules_by_device_type(device_type)
		return_array = []

		device_type = device_type.to_s
		modules.each_pair do |_, m|
			if m[:module_type] != "cmd"
				next
			end

			type = m[:module_layer_2]
			if device_type == type
				return_array << m[:klass]
			end
		end

		return return_array
	end
				
	# 获得所有加载模块的设备类型的字符串型
	# 返回类型为： 数组
	def get_modules_device_type_to_s
		return_array = []
		
		modules_count["cmd"].keys.each do |key|
			return_array << key.to_s
		end

		return return_array
	end
			
			
	# 判断此设备类型的模块是否加载
	def device_type_enable?(device_type)
		true
	end

	def module_type_enable?(module_type)
		["cmd", "input", "output", "special", "description"].include?(module_type)
	end

	def notify(opts={})
		if opts[:count_by_module_type]
			@modules_count = opts[:count_by_module_type]
		end
	end

	# 通过参考名获得模块类
	def get_module_klass_by_name(reference_name)
		begin
			self.modules[reference_name][:klass]
		rescue Exception
			print_error "未找到指定模块: #{reference_name}"
			exit 0
		end
	end
			

end
